/**
 * <strong>原型模式是一种创建型设计模式，使你能够复制已有对象，而又无需使代码依赖它们所属的类。<br>
 * 所有的原型类都必须有一个通用的接口，使得即使在对象所属的具体类未知的情况下也能复制对象。原型对象可以生成自身的完整副本，因为相同类的对象可以相互访问对方的私有成员变量。<br>
 * 在 Java 中使用模式</strong><br>
 * <br>
 * 使用示例：Java 的 Cloneable（可克隆）接口就是立即可用的原型模式。<br>
 * 任何类都可通过实现该接口来实现可被克隆的性质。<br>
 * {@link java.lang.Object#clone()} 类必须实现 java.lang.Cloneable 接口）<br>
 * 识别方法： 原型可以简单地通过 clone或 copy等方法来识别。<br>
 * <br>
 * <strong>复制图形</strong><br>
 * 在不使用标准 Cloneable接口的情况下如何实现原型模式。<br>
 * 在本例中， 原型模式能让你生成完全相同的几何对象副本，同时无需代码与对象所属类耦合。<br>
 * 所有形状类都遵循同一个提供克隆方法的接口。在复制自身成员变量值到结果对象前，子类可调用其父类的克隆方法。<br>
 * <br>
 * <strong>原型模式适合应用场景</strong><br>
 * 场景：<br>
 * 如果你需要复制一些对象，同时又希望代码独立于这些对象所属的具体类，可以使用原型模式。<br>
 * 解决：<br>
 * 这一点考量通常出现在代码需要处理第三方代码通过接口传递过来的对象时。即使不考虑代码耦合的情况，你的代码也不能依赖这些对象所属的具体类，因为你不知道它们的具体信息。<br>
 * 原型模式为客户端代码提供一个通用接口，客户端代码可通过这一接口与所有实现了克隆的对象进行交互，它也使得客户端代码与其所克隆的对象具体类独立开来。<br>
 * <br>
 * 场景：<br>
 * 如果子类的区别仅在于其对象的初始化方式，那么你可以使用该模式来减少子类的数量。别人创建这些子类的目的可能是为了创建特定类型的对象。<br>
 * 解决：<br>
 * 在原型模式中，你可以使用一系列预生成的、各种类型的对象作为原型。<br>
 * 客户端不必根据需求对子类进行实例化，只需找到合适的原型并对其进行克隆即可。<br>
 * <br>
 * <strong>实现方式</strong>
 * <ol>
 *     <li>创建原型接口，并在其中声明<code>克隆</code>方法。如果你已有类层次结构，则只需在其所有类中添加该方法即可。</li>
 *     <li>原型类必须另行定义一个以该类对象为参数的构造函数。构造函数必须复制参数对象中的所有成员变量值到新建实体中。如果你需要修改子类，则必须调用父类构造函数，让父类复制其私有成员变量值。</li>
 *      如果编程语言不支持方法重载，那么你可能需要定义一个特殊方法来复制对象数据。在构造函数中进行此类处理比较方便，因为它在调用 new运算符后会马上返回结果对象。
 *     <li>克隆方法通常只有一行代码：使用new运算符调用原型版本的构造函数。注意，每个类都必须显式重写克隆方法并使用自身类名调用 ew运算符。否则，克隆方法可能会生成父类的对象。</li>
*      <li>你还可以创建一个中心化原型注册表， 用于存储常用原型。</li>
*       你可以新建一个工厂类来实现注册表， 或者在原型基类中添加一个获取原型的静态方法。 该方法必须能够根据客户端代码设定的条件进行搜索。 搜索条件可以是简单的字符串， 或者是一组复杂的搜索参数。 找到合适的原型后， 注册表应对原型进行克隆， 并将复制生成的对象返回给客户端。<br>
 *       最后还要将对子类构造函数的直接调用替换为对原型注册表工厂方法的调用。
 * </ol>
 * <br>
 * <strong>原型模式优缺点</strong>
 * 优点：
 * <ol>
 *     <li>你可以克隆对象，而无需与它们所属的具体类相耦合。</li>
 *     <li>你可以克隆预生成原型， 避免反复运行初始化代码。</li>
 *     <li>你可以更方便地生成复杂对象。</li>
 *     <li>你可以用继承以外的方式来处理复杂对象的不同配置。</li>
 * </ol>
 * 缺点：
 * <ol>
 *     <li>克隆包含循环引用的复杂对象可能会非常麻烦。</li>
 * </ol>
 * <strong>与其他模式的关系</strong>
 * <ul>
 *     <li>在许多设计工作的初期都会使用工厂方法模式（较为简单，而且可以更方便地通过子类进行定制），随后演化为使用抽象工厂模式、原型模式或生成器模式（更灵活但更加复杂）。</li>
 *     <li>抽象工厂模式通常基于一组工厂方法，但你也可以使用原型模式来生成这些类的方法。</li>
 *     <li>原型可用于保存命令模式的历史记录。</li>
 *     <li>大量使用组合模式和装饰模式的设计通常可从对于原型的使用中获益。你可以通过该模式来复制复杂结构，而非从零开始重新构造。</li>
 *     <li>原型并不基于继承，因此没有继承的缺点。另一方面，原型需要对被复制对象进行复杂的初始化。工厂方法基于继承，但是它不需要初始化步骤。</li>
 *     <li>有时候原型可以作为备忘录模式的一个简化版本，其条件是你需要在历史记录中存储的对象的状态比较简单，不需要链接其他外部资源，或者链接可以方便地重建。</li>
 *     <li>抽象工厂、生成器和原型都可以用单例模式来实现。</li>
 * </ul>
 */
package com.cg.design.depthdesign.prototype;